package io.renren.modules.push.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.AppMessage;
import com.gexin.rp.sdk.base.impl.SingleMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.TransmissionTemplate;
import io.renren.common.config.GexinPushConfig;
import io.renren.common.utils.RedisKeys;
import io.renren.common.utils.RedisUtils;
import io.renren.modules.push.PushService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author rdawnx
 * @package_name io.renren.common.utils
 * @class_name GexinPush.java
 * @author_email rdawnxhi@163.com
 * @JDK_version 1.8
 * @create_on 2019/07/29 21:53
 */
@Service("pushService")
public class PushServiceImpl implements PushService {
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private GexinPushConfig gexinPushConfig;

    private String url = "http://sdk.open.api.igexin.com/apiex.htm";

    /**
     * 发送透传消息
     * @param userid 用户id
     * @param businessType 业务类型
     * @param msg 业务消息内容
     * @return 结果：0表示未发送，1表示已发送，-1表示发送失败
     */
    public int pushTransmissionMessageToSingle(String userid, String businessType, String msg) {
        // 如果用户未登录，则不需要提醒
        String cid = redisUtils.get(RedisKeys.getUserGexinKey(userid));
        if (StringUtils.isBlank(cid)) {
            return 0;
        }

        IGtPush push = new IGtPush(url, gexinPushConfig.getAppKey(), gexinPushConfig.getMasterSecret());

        // 新建消息类型 单独推送给用户采用SingleMessage
        SingleMessage singleMessage = new SingleMessage();

        // 新建一个推送模版，已透传模板为例，透传顾名思义到达客户端后不做任何操作，由app选择处理
        // 其他原生模板类型种类很多，支持各种客户端展现效果，包括弹框下载、打开链接等等。模板里也可以设置响铃震动等效果。
        TransmissionTemplate template = new TransmissionTemplate();
        template.setAppId(gexinPushConfig.getAppId());
        template.setAppkey(gexinPushConfig.getAppKey());
//            template.setTransmissionContent("透传的内容！！！");
        //组织消息内容
        Map<String, Object> msgMap = new LinkedHashMap<>();
        msgMap.put("type", "tcxx");//tcxx表示透传消息
        msgMap.put("businessType", businessType);
        msgMap.put("msg", msg);
        template.setTransmissionContent(JSON.toJSONString(msgMap));
        // 收到消息是否立即启动应用： 1为立即启动，2则广播等待客户端自启动
        template.setTransmissionType(2);

        // 模板设置好后塞进message里，同时可以配置这条message是否支持离线，以及过期时间等，单位毫秒
        //若设置离线，个推推送系统会为当前不在线的用户缓存离线消息，个推现在支持为每个用户缓存多条离线消息，离线时间最多三天，三天后会删除该条离线消息
        singleMessage.setData(template);
        singleMessage.setOffline(true);
        singleMessage.setOfflineExpireTime(1800 * 1000);

        // 新建一个推送目标，填入appid和clientId
        // 单推情况下只能设置一个推送目标，toList群推时，可以设置多个目标，目前建议一批设置50个左右。
        Target target = new Target();
        target.setAppId(gexinPushConfig.getAppId());
        target.setClientId(cid);
        // 调用IGtPush实例的toSingle接口，参数就是上面我们配置的message和target
        // 推送接口
        // pushMessageToSingle==单个用户/ pushMessageToList==一批用户/
        // pushMessageToApp==应用中的全部用户。
        IPushResult result = push.pushMessageToSingle(singleMessage, target);
        String response = result.getResponse().toString();
        System.out.println(response);
        if ("{result=ok".startsWith(response)) {
            return 1;
        }
        return -1;

    }

    /**
     * 发送透传消息
     * @param businessType 业务类型
     * @param msg 业务消息内容
     * @return 结果：0表示未发送，1表示已发送，-1表示发送失败
     */
    public int pushTransmissionMessageToApp(String businessType, String msg) {
        // 如果用户未登录，则不需要提醒

        IGtPush push = new IGtPush(url, gexinPushConfig.getAppKey(), gexinPushConfig.getMasterSecret());

        // 新建消息类型 单独推送给用户采用SingleMessage
        SingleMessage singleMessage = new SingleMessage();

        // 新建一个推送模版，已透传模板为例，透传顾名思义到达客户端后不做任何操作，由app选择处理
        // 其他原生模板类型种类很多，支持各种客户端展现效果，包括弹框下载、打开链接等等。模板里也可以设置响铃震动等效果。
        TransmissionTemplate template = new TransmissionTemplate();
        template.setAppId(gexinPushConfig.getAppId());
        template.setAppkey(gexinPushConfig.getAppKey());
//            template.setTransmissionContent("透传的内容！！！");
        //组织消息内容
        Map<String, Object> msgMap = new LinkedHashMap<>();
        msgMap.put("type", "tcxx");//tcxx表示透传消息
        msgMap.put("businessType", businessType);
        msgMap.put("msg", msg);
        template.setTransmissionContent(JSON.toJSONString(msgMap));
        // 收到消息是否立即启动应用： 1为立即启动，2则广播等待客户端自启动
        template.setTransmissionType(2);

        // 模板设置好后塞进message里，同时可以配置这条message是否支持离线，以及过期时间等，单位毫秒
        //若设置离线，个推推送系统会为当前不在线的用户缓存离线消息，个推现在支持为每个用户缓存多条离线消息，离线时间最多三天，三天后会删除该条离线消息
        singleMessage.setData(template);
        singleMessage.setOffline(true);
        singleMessage.setOfflineExpireTime(1800 * 1000);

        // 调用IGtPush实例的toSingle接口，参数就是上面我们配置的message和target
        // 推送接口
        // pushMessageToSingle==单个用户/ pushMessageToList==一批用户/
        // pushMessageToApp==应用中的全部用户。
        AppMessage appMessage = new AppMessage();
        appMessage.setData(template);
        appMessage.setOffline(true);
        appMessage.setOfflineExpireTime(1800 * 1000);

        List<String> appList = new ArrayList<>();
        appList.add(gexinPushConfig.getAppId());

        appMessage.setAppIdList(appList);

        IPushResult result = push.pushMessageToApp(appMessage);
        String response = result.getResponse().toString();
        System.out.println(response);
        if ("{result=ok".startsWith(response)) {
            return 1;
        }
        return -1;
    }
}
